home *** CD-ROM | disk | FTP | other *** search
/ ShareWare OnLine 2 / ShareWare OnLine Volume 2 (CMS Software)(1993).iso / prog / bled.zip / BLED.BAS next >
BASIC Source File  |  1993-05-01  |  57KB  |  1,754 lines

  1. DECLARE SUB WRITENEW (NEWOUT$, NWRITE%, SKIP.COMMENTS%)
  2. DECLARE SUB GETCHAR (ROW%, COL%, PROMPT$, VLDANS$, RESULT$)
  3. DECLARE SUB BRKWORDS (STRNG$, WORDS$(), NPARM%)
  4. DECLARE SUB CREDITS ()
  5. DECLARE SUB PRTHELP ()
  6. DECLARE SUB EXPLAIN (STRNG$)
  7. DECLARE SUB PRTSCRN (NUMFLDS%, ROW%(), COL%(), PROMPT$(), FLDSIZE%(), FLDTYPE$(), FLDVAL$(), HLP$())
  8. DECLARE SUB GETSCRN (NUMFLDS%, ROW%(), COL%(), PROMPT$(), FLDSIZE%(), FLDTYPE$(), FLDVAL$(), HLP$())
  9. DECLARE SUB WRMIS (EXPLN$, MISTAKE$)
  10. DECLARE SUB FIRSTWORD (STRNG$, FIRST.WORD$, BS%)
  11. DECLARE SUB CHKCONT (STRNG$, LINEON$, REMCHAR$, CONTINUED%)
  12. DECLARE SUB NUMERIC (STRNG$, RESULT%)
  13. DECLARE SUB GETTRANS (FILENO%, TRANS$, NTRANS%)
  14. DECLARE SUB TRIM (STRNG$)
  15. DECLARE SUB TRIMTRAIL (STRNG$)
  16. DECLARE SUB CHKNARY (ELEMENT$, ARRAY$(), NUM.ENTRIES.TO.SEARCH%, IS.IN.ARA%, BEG%)
  17. DECLARE SUB GETNXTCMD (FILENO%, CMD$, DOCCHAR$, STBLKTYPE$, ENDBLKTYPE$, STDES.NO%, ENDDES.NO%, STTARGET$, ENDTARGET$, INCREMENT%, PTR%, CMD.TYPE$, INS.BLKTYPE$, FIXED.NO%, BLK.DISP$)
  18. DECLARE SUB FIRSTNB (STRNG$, BEG%, WHEREIS%)
  19. DECLARE SUB CENTERBEG (STRNG$, LSIZE%, BEG%)
  20. DECLARE SUB GETSTR (ROW%, COL%, PROMPT$, FLDSIZE%, RESULT$)
  21. DECLARE SUB INQUOTES (STRNG$, BS%, INQUO%)
  22. DECLARE SUB ENDNB (STRNG$, LST%)
  23. DECLARE SUB WAITSECORKEY (SECONDS%)
  24. DECLARE SUB READNXT (FILENO%, BUF$(), NUM.NBUF%, DOCCHAR$, CMD$)
  25. DECLARE SUB PARSECMD (CMD$, STBLKTYPE$, ENDBLKTYPE$, STDES.NO%, ENDDES.NO%, STTARGET$, ENDTARGET$, INCREMENT%, PTR%, INCLUSIVE%, CMD.TYPE$, INS.BLKTYPE$, FIXED.NO%)
  26. DECLARE SUB GETDISP (BUF$(), NUM.NBUF%, DOCCHAR$, BLK.DISP$, FILENO%)
  27. DECLARE SUB LASTNB (STRNG$, BEG%, WHEREIS%)
  28. DECLARE SUB ECHO (STRNG$, ROW%, COL%, FLDSIZE%)
  29. DECLARE SUB GETNATNUM (ROW%, COL%, PROMPT$, FLDSIZE%, RESULT$)
  30. DECLARE SUB CHKWRDS (BLKTYPE$, DES.NO%, TARGET$, NUWRD%, INCMT%, WRDS$(), BEG%, PTR%)
  31. DECLARE SUB NOOTHER (STRNG$, ONLY$, RESULT%)
  32. REM ****************************************************************
  33. REM *         NOTICE:  DO NOT REMOVE THIS NOTICE                   *
  34. REM *         BLED - (C) 1985-1993 by Ken Goosens                  *
  35. REM *       5020 Portsmouth Road, Fairfax, VA 22032                *
  36. REM ****************************************************************
  37. REM 8 April 1986 enhanced to add comments to bled merge
  38. REM 13 April 1986 fixed bug so could embed source code in comments
  39. REM 1 June 1986 Added buffered output & increased default max lines
  40. REM 25 Jan 1987 Support for preserving BLED and BLED SOURCE comments
  41. REM 8 Mar 1987 Fixed 2 bugs concerning preserve option
  42. REM 21 Mar 1987 Added beeps at end of a batch run
  43. REM 27 Feb 1988 Correctly bug.  Reported size old file wrong
  44. REM             Put 4th command parm in help
  45. REM 20 Mar 1988 Enhanced to support metacommands
  46. REM 6 June 1988 Support more METAVARIABLES and option to remove comments
  47. REM *******************   DRIVER MODULE   **************************
  48.  
  49. DEFINT A-Z
  50.  
  51. NCNFG = 13
  52. DIM CWRDS$(20), FROW(3), FCOL(3), FPROMPT$(3), FFLDSIZE(3), FFLDTYPE$(3)
  53. DIM FFLDVAL$(3), FHLP$(3), CROW(NCNFG), CCOL(NCNFG), CPRO$(NCNFG)
  54. DIM CFLDSIZE(NCNFG), CFLDTYPE$(NCNFG), CFLDVAL$(NCNFG), CHLP$(NCNFG)
  55. DIM METANAME$(99), METAVAL$(99)          ' 06-06
  56.  
  57. GOSUB DOCMDLINE
  58. GOSUB SETCONSTANTS
  59. GOSUB GETCONFIG
  60. LBLK = LEN(ENDBLK$)
  61. TRANSBLK$ = SPACE$(LBLK)
  62. OPEN "O", #4, WARNFILE$
  63. MAXBTWLINES = VAL(MAXBTWLINES$)
  64. REDIM MBUF$(MAXBTWLINES), TBUF$(MAXBTWLINES)
  65. IF RUN.BATCH = 0 THEN GOSUB ASKMERGE
  66.  
  67. WHILE ANS$ <> "Q"
  68.    X = INSTR(CMVAL$, ANS$)
  69.    IF X > 1 THEN PRINT #4, "--[WARNINGS FOR FUNCTION "; ANS$; "]--"
  70.    FILE.COMPARE = (ANS$ = "F")
  71.    ON INSTR(CMVAL$, ANS$) GOSUB SETCONFIG, FILECOMPARE, DOLINEMERGE, DOMERGE
  72.    NWRITE = -1
  73.    CALL WRITENEW(X$, NWRITE,0)  ' 06-06
  74.    CLOSE #3
  75.    COLOR 7, 0
  76.    ANS$ = "Q"
  77.    IF RUN.BATCH = 0 THEN GOSUB ASKMERGE ELSE BEEP: BEEP: BEEP
  78. WEND
  79. CLOSE #4
  80. LOCATE 24, 1: PRINT
  81.       
  82. END
  83.  
  84. REM  *********************    GOSUBS    **************************
  85.  
  86. ASKMERGE:
  87.  
  88.    LOCATE CMRO, 1
  89.    PRINT SPACE$(79)
  90.    CALL GETCHAR(CMRO, CMCO, CMPRO$, CMVAL$, ANS$)
  91.  
  92. RETURN
  93.  
  94. REM  ****              PREPATORY SUBROUTINES                  ****
  95. REM  **********  DOCMDLINE, SETCONSTANTS, GETCONFIG **************
  96.  
  97. REM -----------------------[ DOCMDLINE ]------------------------------------------------
  98.  
  99. DOCMDLINE:
  100.  
  101. REM PROCESSES COMMAND LINE ARGUMENTS FROM DOS
  102.  
  103.   RUN.BATCH = INSTR(COMMAND$, "/B")
  104.   LINE.MERGE = INSTR(COMMAND$, "/L")
  105.   REG.MERGE = INSTR(COMMAND$, "/M")
  106.   FILE.COMPARE = INSTR(COMMAND$, "/F")
  107.   REMOVE.COMMENTS = INSTR(COMMAND$,"/RC")   ' 06-06
  108.  
  109.   IF (LINE.MERGE OR REG.MERGE OR FILE.COMPARE) THEN
  110.      IF (LINE.MERGE AND REG.MERGE) OR (LINE.MERGE AND FILE.COMPARE) OR (REG.MERGE AND FILE.COMPARE) THEN
  111.         X$ = "Can not use more than one of /F /L /M."
  112.         GOSUB DOABORT
  113.      END IF
  114.   END IF
  115.   IF REG.MERGE THEN ANS$ = "M" ELSE IF LINE.MERGE THEN ANS$ = "L" ELSE IF FILE.COMPARE THEN ANS$ = "F" ELSE ANS$ = ""
  116.   IF RUN.BATCH AND ANS$ = "" THEN X$ = "Must specify one of /F /L /M to run batch.": GOSUB DOABORT
  117.   CALL BRKWORDS(COMMAND$, CWRDS$(), I)
  118.   NON.OPT = 1
  119.   WHILE INSTR(CWRDS$(NON.OPT), "/") > 0
  120.     NON.OPT = NON.OPT + 1
  121.   WEND
  122.   IF RUN.BATCH AND CWRDS$(NON.OPT + 2) = "" THEN
  123.      X$ = "Must specify all three file arguments to run batch."
  124.      GOSUB DOABORT
  125.   END IF
  126.   IF COMMAND$ = "" THEN CALL CREDITS
  127.  
  128.   IF CWRDS$(NON.OPT + 4) <> "" THEN CONFIGFILE$ = CWRDS$(NON.OPT + 4) ELSE CONFIGFILE$ = "BLED.CFG"
  129.   IF CWRDS$(NON.OPT + 3) <> "" THEN WARNFILE$ = CWRDS$(NON.OPT + 3) ELSE WARNFILE$ = ""
  130.   IF CWRDS$(NON.OPT + 2) <> "" THEN NEWFILE$ = CWRDS$(NON.OPT + 2) ELSE NEWFILE$ = "SC"
  131.   IF CWRDS$(NON.OPT + 1) <> "" THEN BTCHCMDS$ = CWRDS$(NON.OPT + 1) ELSE BTCHCMDS$ = "SC"
  132.   IF CWRDS$(NON.OPT) <> "" THEN ORIGFILE$ = CWRDS$(NON.OPT) ELSE ORIGFILE$ = "SC"
  133.  
  134.   LIMIT.RUN = INSTR(COMMAND$, "/T=")
  135.   IF LIMIT.RUN = 0 THEN RETURN
  136.   LIMIT.RUN = LIMIT.RUN + 1
  137.   LAST.CHAR = INSTR(LIMIT.RUN, COMMAND$, "/")
  138.   IF LAST.CHAR = 0 THEN LAST.CHAR = INSTR(LIMIT.RUN, COMMAND$, " ")
  139.   IF LAST.CHAR = 0 THEN LAST.CHAR = LEN(COMMAND$) + 1
  140.   MAX.LL = VAL(MID$(COMMAND$, LIMIT.RUN + 2, LAST.CHAR - LIMIT.RUN - 2))
  141. REM  PRINT "MAX.LL=";MAX.LL;" GOT FROM ";COMMAND$;" starting at ";LIMIT.RUN+2;_
  142. REM    " and grabbing ";LAST.CHAR-LIMIT.RUN-2;" chars"
  143. REM   PRINT "Last char=";last.char: input xx$
  144. RETURN
  145.  
  146. DOABORT:
  147.  
  148. REM PREMATURELY TERMINATE WITH CENTERED ERROR MESSAGE AND HELP
  149.  
  150.   BEEP
  151.   X = LEN(X$) + 17
  152.   IF X < 78 THEN K = (78 - X) / 2 ELSE K = 0
  153.   PRINT SPACE$(K); X$; "  Aborting."
  154.   CALL PRTHELP
  155.   END
  156.  
  157. RETURN
  158.  
  159. REM --------------------------[ SETCONSTANTS ]-----------------------------
  160.  
  161. SETCONSTANTS:
  162.  
  163. REM ASSIGNS CONSTANTS USED IN PROGRAM
  164.  
  165.   HI.VALUE# = 99999999
  166.   ONE = 1
  167.   TWO = 2
  168.   SEVENTYTWO = 72
  169.  
  170.   INSERTING$ = "* INSERTING new line(s)"
  171.   DELETING$ = "* DELETING old line(s)"
  172.   REPLACING$ = "* REPLACING old line(s) by new"
  173.   FIRSTDIF$ = "* ------[ first line different ]------"
  174.  
  175.   CMPRO$ = "C)onfigure, F)ile compare, L)ine# merge, M)erge, Q)uit (C,F,L,M,Q): "
  176.   CMRO = 21
  177.   CMCO = 4
  178.   CMVAL$ = "CFLMQ"
  179.  
  180.   EDPRO$ = "E)dit, R)un, Q)uit (E,R,Q): "
  181.   EDRO = 23
  182.   EDCO = 18
  183.   EDVAL$ = "ERQ"
  184.  
  185.   CFRO = 23
  186.   CFCO = 20
  187.   CFPRO$ = "E)dit, S)ave, Q)uit (E,S,Q): "
  188.   CFVAL$ = "ESQ"
  189.  
  190.   THREE = 3
  191.   FOUR = 4
  192.   FROW(1) = 7
  193.   FROW(2) = 9
  194.   FROW(3) = 11
  195.   FCOL(1) = 10
  196.   FCOL(2) = 10
  197.   FCOL(3) = 10
  198.   FFLDSIZE(1) = 40
  199.   FFLDSIZE(2) = 40
  200.   FFLDSIZE(3) = 40
  201.   FFLDTYPE$(1) = "S"
  202.   FFLDTYPE$(2) = "S"
  203.   FFLDTYPE$(3) = "S"
  204.   IN.MERGE = -1
  205.   METAROW = 13                   ' 03-20
  206.   M1COL = 5                      ' 03-20
  207.   METACOL = 24                   ' 03-20
  208.   METACMND$ = "$"                ' 03-20
  209.  
  210.   FOR I = 1 TO NCNFG
  211.     READ CROW(I), CCOL(I), CPRO$(I), CFLDSIZE(I), CFLDTYPE$(I), CFLDVAL$(I), CHLP$(I)
  212.   NEXT
  213.  
  214. DATA  01,18,"BATCH LINE EDITOR - CONFIGURATION   Ver 2.2",00,L,   ,
  215. DATA  03,12,"Source EXTENSION:"                  ,03,S,BAS,"Default extension for source file to be edited (e.g. BAS)"
  216. DATA  04,12,"Merge EXTENSION:"                   ,03,S,MRG,"Default extension for file of changes to source (e.g. MRG)"
  217. DATA  05,12,"Source remarks begin with:"         ,03,S,"'","Logically ignore rest of physical line beyond this"
  218. DATA  06,12,"END OF BLOCK Phrase:"               ,20,S,ENDBLOCK,"Phrase used in BLED for the end of a block"
  219. DATA  07,12,"Documentation BEGINS with: "        ,01,S,*  ,"Character that documentation lines begin with in BLED merge file"
  220. DATA  08,12,"Alphanumeric LABELS END with:"      ,01,S,":","Character on end of an alphanumeric label (e.g. ':' in 'GETOUT:')"
  221. DATA  09,12,"BLED COMMANDS BEGIN with:"          ,01,S,   ,"Character starting BLED commands in merge file (default none)"
  222. DATA  10,12,"IGNORE CASE in Labels?"             ,01,S,Y  ,"Lower/upper case are same in labels (e.g. 'LABEL1' and 'label1')"
  223. DATA  11,12,"CONTINUED LINES END with:"          ,01,S,_  ,"Character used to continue logical line onto next line"
  224. DATA  12,12,"Write WARNINGS to:"                 ,30,S,WARNING,"File to write warning messages to"
  225. DATA  13,12,"Max # physical lines btw line #'s:" ,04,N,400,"In file compare, max # physical lines between two line numbers"
  226. DATA  14,12,"Preserve BLED comments (Y/N):"      ,01,S,Y  ,"Convert BLED comments to/from source BLED comments"
  227. RETURN
  228.  
  229. REM -------------------------[ GETCONFIG ]---------------------------------
  230.  
  231. GETCONFIG:
  232.  
  233. REM   GETS CONFIGURATION PARAMETERS
  234.  
  235.    ON ERROR GOTO NOCONFIG
  236.    OPEN "I", #1, CONFIGFILE$
  237.  
  238. READIN:
  239.      ON ERROR GOTO 0
  240.      LINE INPUT #1, DESOURCE$
  241.      LINE INPUT #1, DEMERGES$
  242.      LINE INPUT #1, REMCHAR$
  243.      LINE INPUT #1, ENDBLK$
  244.      LINE INPUT #1, DOCCHAR$
  245.      LINE INPUT #1, END.LABEL$
  246.      LINE INPUT #1, BLEDCMD$
  247.      LINE INPUT #1, IGNORECASE$
  248.      LINE INPUT #1, LINEON$
  249.      LINE INPUT #1, X$
  250.      IF WARNFILE$ = "" THEN WARNFILE$ = X$
  251.      LINE INPUT #1, MAXBTWLINES$
  252.      LINE INPUT #1, X$
  253.      PRESERVE.COMMENTS = (LEFT$(X$, 1) <> "N")
  254.      BLED.SOURCE.COMMENT$ = REMCHAR$ + "<" + DOCCHAR$ + ">"
  255.      CLOSE #1
  256.      METALINE$ = DOCCHAR$ + METACMND$      ' 03-20
  257.    RETURN
  258.  
  259. USEDEFAULTS:
  260.      ON ERROR GOTO 0
  261.      DESOURCE$ = "BAS"
  262.      DEMERGES$ = "MRG"
  263.      REMCHAR$ = "'"
  264.      ENDBLK$ = "ENDBLOCK"
  265.      DOCCHAR$ = "*"
  266.      END.LABEL$ = ":"
  267.      BLEDCMD$ = ""
  268.      IGNORECASE$ = "Y"
  269.      LINEON$ = "_"
  270.      IF WARNFILE$ = "" THEN WARNFILE$ = "WARNING"
  271.      MAXBTWLINES$ = "400"
  272.      PRESERVE.COMMENTS = 0
  273.      METALINE$ = DOCCHAR$ + METACMND$      ' 03-20
  274.    RETURN
  275.  
  276. NOCONFIG:
  277.    X$ = "Config file " + CONFIGFILE$ + " missing/bad.  Using QuickBASIC defaults."
  278.    CALL EXPLAIN(X$)
  279.    RESUME USEDEFAULTS
  280.  
  281. REM -----------------------------------------------------------------------
  282.  
  283. REM *****                MAIN   ROUTINES                       ****
  284. REM **********  SETCONFIG,FILECOMPARE,DOLINEMERGE,DOMERGE      ****
  285.  
  286. REM -----------------------[ SETCONFIG ]-----------------------------------
  287.  
  288. SETCONFIG:
  289.  
  290. REM      ALLOWS USER TO RECONFIGURE
  291.  
  292.    CFLDVAL$(2) = DESOURCE$
  293.    CFLDVAL$(3) = DEMERGES$
  294.    CFLDVAL$(4) = REMCHAR$
  295.    CFLDVAL$(5) = ENDBLK$
  296.    CFLDVAL$(6) = DOCCHAR$
  297.    CFLDVAL$(7) = END.LABEL$
  298.    CFLDVAL$(8) = BLEDCMD$
  299.    CFLDVAL$(9) = IGNORECASE$
  300.    CFLDVAL$(10) = LINEON$
  301.    CFLDVAL$(11) = WARNFILE$
  302.    OLDWARN$ = WARNFILE$
  303.    CFLDVAL$(12) = MAXBTWLINES$
  304.    CFLDVAL$(13) = MID$("NY", 1 - PRESERVE.COMMENTS, 1)
  305.  
  306.    CALL PRTSCRN(NCNFG, CROW(), CCOL(), CPRO$(), CFLDSIZE(), CFLDTYPE$(), CFLDVAL$(), CHLP$())
  307.    CO = 1: CALL QPRINT(SPACE$(79), FRO, CO)
  308. RESETCNFG:
  309.      ANS$ = "E"
  310.      CALL GETCHAR(CFRO, CFCO, CFPRO$, CFVAL$, ANS$)
  311.      WHILE ANS$ = "E"
  312.        CALL GETSCRN(NCNFG, CROW(), CCOL(), CPRO$(), CFLDSIZE(), CFLDTYPE$(), CFLDVAL$(), CHLP$())
  313.        LOCATE CFRO, 1: PRINT SPACE$(79)
  314.        ANS$ = "": CALL GETCHAR(CFRO, CFCO, CFPRO$, CFVAL$, ANS$)
  315.      WEND
  316.  
  317.  DESOURCE$ = CFLDVAL$(2)
  318.  BTCHCMDS$ = CFLDVAL$(3)
  319.  REMCHAR$ = CFLDVAL$(4)
  320.  ENDBLK$ = CFLDVAL$(5)
  321.  DOCCHAR$ = CFLDVAL$(6)
  322.  END.LABEL$ = CFLDVAL$(7)
  323.  BLEDCMD$ = CFLDVAL$(8)
  324.  IGNORECASE$ = CFLDVAL$(9)
  325.  LINEON$ = CFLDVAL$(10)
  326.  WARNFILE$ = CFLDVAL$(11)
  327.  MAXBTWLINES$ = CFLDVAL$(12)
  328.  PRESERVE.COMMENTS = (LEFT$(CFLDVAL$(13), 1) <> "N")
  329.  BLED.SOURCE.COMMENT$ = REMCHAR$ + "<" + DOCCHAR$ + ">"
  330.  IF WARNFILE$ <> OLDWARN$ THEN CLOSE #4: OPEN "O", #4, WARNFILE$
  331.  IF ANS$ = "Q" THEN RETURN
  332.  IF ANS$ <> "S" THEN RETURN
  333.      OPEN "O", #1, CONFIGFILE$
  334.      FOR I = 1 TO NCNFG
  335.        IF CFLDTYPE$(I) <> "L" THEN PRINT #1, CFLDVAL$(I)
  336.      NEXT
  337.      CLOSE #1
  338.      GOTO RESETCNFG
  339.  
  340. RETURN
  341.  
  342. REM -----------------------[ FILECOMPARE ]---------------------------------
  343.  
  344. FILECOMPARE:
  345.  
  346. REM     COMPARES TWO FILES, PRODUCES MERGE FILE FOR LINE MERGING
  347.  
  348.   IN.MERGE = 0
  349.   FPROMPT$(1) = "OLD Version:"
  350.   FPROMPT$(2) = "NEW Version:"
  351.   FPROMPT$(3) = "MERGES (to OLD to make NEW):"
  352.   FHLP$(1) = "Old version of file that has been changed"
  353.   FHLP$(2) = "New, modified version of file"
  354.   FHLP$(3) = "Create file of changes to old version needed to make new version"
  355.   TOPTITLE$ = "COMPARING FILES - Generating Merge"
  356.   GOSUB GETFILES
  357.   IF FANS$ = "Q" THEN RETURN
  358.  
  359.    HEADER$ = DOCCHAR$ + " ------------[ BLED merge (c) Ken Goosens ]-------------"
  360.    CALL WRITENEW(HEADER$, NWRITE,O) '06-06
  361.    HEADER$ = DOCCHAR$ + " Merge this against " + ORIGFILE$ + " to produce " + BTCHCMDS$
  362.    CALL WRITENEW(HEADER$, NWRITE,0) ' 06-06
  363.    CALL GETFDATE(ORIGFILE$ + CHR$(0), MM, DD, YY)
  364.    FDATE$ = MID$(STR$(MM), 2) + "-" + MID$(STR$(DD), 2) + "-" + MID$(STR$(YY), 2)
  365.    FSIZE$ = MID$(STR$(LOF(1)), 2) + " bytes"                 ' 02-27-88
  366.    HEADER$ = DOCCHAR$ + " " + ORIGFILE$ + ":  Date " + FDATE$ + "  Size " + FSIZE$
  367.    CALL WRITENEW(HEADER$, NWRITE,0) ' 06-06
  368.    HEADER$ = DOCCHAR$ + " ------------[ Created " + DATE$ + " " + TIME$ + " ]------------"
  369.    CALL WRITENEW(HEADER$, NWRITE, 0) ' 06-06
  370.  
  371.    TRANS# = 0
  372.    MAST# = 0
  373.    GOSUB READLINETRANS
  374.    GOSUB READLINEOLD
  375.    WHILE MAST# < HI.VALUE# OR TRANS# < HI.VALUE#
  376.       IF TRANS# < MAST# THEN
  377.          CALL WRITENEW(INSERTING$, NWRITE, 0) ' 06-06
  378.          WHILE TRANS# < MAST#
  379.             GOSUB COMPARENUTRANS
  380.             CALL WRITENEW(NUTRANS$, NWRITE, REMOVE.COMMENTS) ' 06-06
  381.             GOSUB READLINETRANS
  382.          WEND
  383.       END IF
  384.       IF MAST# < TRANS# THEN
  385.          CALL WRITENEW(DELETING$, NWRITE,0) ' 06-06
  386.          WHILE MAST# < TRANS#
  387.             PREV# = MAST#
  388.             FW$ = MID$(STR$(MAST#), 2)
  389.             CALL WRITENEW(FW$, NWRITE, 0)  ' 06-06
  390.             WHILE PREV# = MAST#
  391.                GOSUB READLINEOLD
  392.             WEND
  393.          WEND
  394.       END IF
  395.       IF TRANS# = MAST# AND MAST# < HI.VALUE# THEN
  396.          PREV# = TRANS#
  397.          J = 0
  398.          WHILE PREV# = TRANS# AND J < MAXBTWLINES
  399.             J = J + 1
  400.             TBUF$(J) = NUTRANS$
  401.             GOSUB READLINETRANS
  402.          WEND
  403.          I = 0
  404.          WHILE PREV# = MAST# AND I < MAXBTWLINES: I = I + 1
  405.             MBUF$(I) = TRANS$
  406.             GOSUB READLINEOLD
  407.          WEND
  408.          GOSUB CHKEXCEED
  409.          IF M$ <> "" THEN
  410.             N$ = "Logical line exceeds maximum physical lines.  Reconfigure"
  411.             CALL WRMIS(M$, N$)
  412.          ELSE
  413.             GOSUB CHKDIF
  414.             IF ARE.DIFF THEN
  415.                CALL WRITENEW(REPLACING$, NWRITE, 0) ' 06-06
  416.                GOSUB COMPARETBUF
  417.                FOR I = 1 TO K - 1
  418.                   CALL WRITENEW(TBUF$(I), NWRITE, REMOVE.COMMENTS) ' 06-06
  419.                NEXT
  420.                GOSUB WRITEDIF
  421.                FOR I = K TO MAX
  422.                   CALL WRITENEW(TBUF$(I), NWRITE, REMOVE.COMMENTS) ' 06-06
  423.                NEXT
  424.                FOR I = MAX + 1 TO MAXMAX
  425.                   CALL WRITENEW(TBUF$(I), NWRITE, REMOVE.COMMENTS) ' 06-06
  426.                NEXT
  427.             END IF
  428.          END IF
  429.       END IF
  430.    WEND
  431.    CLOSE #1, #2
  432.    IN.MERGE = -1
  433.  
  434. RETURN
  435.  
  436. WRITEDIF:
  437.  
  438.    IF MAXMAX > 1 THEN CALL WRITENEW(FIRSTDIF$, NWRITE, 0)  ' 06-06
  439.  
  440.    RETURN
  441.  
  442. CHKEXCEED:
  443.  
  444.    M$ = ""
  445.    IF I = UBOUND(MBUF$) THEN M$ = "[File " + ORIGFILE$ + "]" ELSE IF J = UBOUND(TBUF$) THEN M$ = "[File " + BTCHCMDS$ + "]"
  446.  
  447. RETURN
  448.  
  449. CHKDIF:
  450.  
  451. IF I = J THEN ARE.DIFF = 0 ELSE ARE.DIFF = -1
  452. IF I <= J THEN MAX = I ELSE MAX = J
  453. MAXMAX = J
  454. K = 0
  455. CHKAG:
  456.   K = K + 1
  457.   IF K <= MAX THEN
  458.      IF TBUF$(K) = MBUF$(K) THEN
  459.         GOTO CHKAG
  460.      ELSE
  461.         ARE.DIFF = -1
  462.      END IF
  463.   END IF
  464. GETOUTCHKDIF:
  465.  
  466. RETURN
  467.  
  468. COMPARENUTRANS:
  469.  
  470.    IF NOT PRESERVE.COMMENTS THEN RETURN
  471.    CALL FIRSTWORD(NUTRANS$, FW$, BEGIN.AT)
  472.    IF LEFT$(FW$, 4) = BLED.SOURCE.COMMENT$ THEN
  473.       NUTRANS$ = LEFT$(NUTRANS$, BEGIN.AT - 1) + DOCCHAR$ + RIGHT$(NUTRANS$, LEN(NUTRANS$) - BEGIN.AT - 3)
  474.    END IF
  475. RETURN
  476.  
  477. COMPARETBUF:
  478.  
  479.    IF NOT PRESERVE.COMMENTS THEN RETURN
  480.    FOR I = 1 TO MAXMAX
  481.      CALL FIRSTWORD(TBUF$(I), FW$, BEGIN.AT)
  482.      IF LEFT$(FW$, 4) = BLED.SOURCE.COMMENT$ THEN
  483.         TBUF$(I) = LEFT$(TBUF$(I), BEGIN.AT - 1) + DOCCHAR$ + RIGHT$(TBUF$(I), LEN(TBUF$(I)) - BEGIN.AT - 3)
  484.      END IF
  485.    NEXT
  486.      
  487. RETURN
  488.  
  489. REM -----------------------[ DOLINEMERGE ]---------------------------------
  490.  
  491. DOLINEMERGE:
  492.  
  493. REM               MERGES BASED ON LINE NUMBER LABELS
  494.  
  495.   TOPTITLE$ = "MERGING using Line Number Labels"
  496.   GOSUB STANDARDFILES
  497.   IF FANS$ = "Q" THEN RETURN
  498.   LOCATE METAROW, M1COL
  499.   COLOR 7, 0
  500.   PRINT "LAST Metacommand: ";            ' 03-20
  501.   COLOR 0, 7
  502.   METACOL = POS(0)                       ' 03-20
  503.  
  504.  
  505.    TRANS# = 0
  506.    MAST# = 0
  507.    GOSUB READLINETRANS
  508.    GOSUB READLINEOLD
  509.    WHILE TRANS# < HI.VALUE# OR MAST# < HI.VALUE#
  510.       WHILE TRANS# < MAST# AND J < MAXBTWLINES
  511.         PREV# = TRANS#
  512.         J = 0
  513.         WHILE PREV# = TRANS#
  514.          IF ONLY.LINENO THEN
  515.             M$ = TRANS$
  516.             N$ = "Line number to be deleted not found."
  517.             CALL WRMIS(M$, N$)
  518.          ELSE
  519.             J = J + 1
  520.             TBUF$(J) = NUTRANS$
  521.          END IF
  522.          GOSUB READLINETRANS
  523.        WEND
  524.         FOR I = 1 TO J: CALL WRITENEW(TBUF$(I), NWRITE, REMOVE.COMMENTS): NEXT '06-06
  525.       WEND
  526.       WHILE MAST# < TRANS#
  527.          PREV# = MAST#
  528.          WHILE PREV# = MAST#
  529.            CALL WRITENEW(TRANS$, NWRITE, REMOVE.COMMENTS) ' 06-06
  530.            GOSUB READLINEOLD
  531.          WEND
  532.       WEND
  533.       IF TRANS# = MAST# AND MAST# < HI.VALUE# THEN
  534.          PREV# = TRANS#
  535.          J = 0
  536.          WHILE PREV# = TRANS# AND J < MAXBTWLINES
  537.             GOSUB CHKWRITE
  538.             GOSUB READLINETRANS
  539.          WEND
  540.          FOR I = 1 TO J
  541.             CALL WRITENEW(TBUF$(I), NWRITE, REMOVE.COMMENTS) ' 06-06
  542.          NEXT
  543.          WHILE PREV# = MAST#
  544.             GOSUB READLINEOLD
  545.          WEND
  546.       END IF
  547.    WEND
  548.    CLOSE #1, #2
  549.  
  550. RETURN
  551.  
  552. CHKWRITE:
  553.  
  554. IF NOT ONLY.LINENO THEN J = J + 1: TBUF$(J) = NUTRANS$
  555.  
  556. RETURN
  557.  
  558. READLINEOLD:
  559.  
  560.    IF EOF(1) THEN
  561.       MAST# = HI.VALUE#
  562.    ELSE
  563.       GOSUB READOLDREC
  564.       CALL FIRSTWORD(TRANS$, FW$, BEGIN.AT)
  565.       IF FW$ = "" THEN
  566.          PREV.MAST = 0
  567.          RETURN
  568.       ELSE
  569.          CONTINUED.MAST = PREV.MAST
  570.          CALL CHKCONT(TRANS$, LINEON$, REMCHAR$, PREV.MAST)
  571.          IF CONTINUED.MAST = 0 THEN
  572.             CALL NUMERIC(FW$, NATNO)
  573.             IF NATNO OR (VAL(FW$)>0 AND RIGHT$(FW$,1)=END.LABEL$) THEN
  574.                PREV# = MAST#
  575.                MAST# = VAL(FW$)
  576.                IF MAST# <= PREV# THEN
  577.                   N$ = "Source line " + FW$ + " occurs after line#" + STR$(PREV#)
  578.                   CALL WRMIS(TRANS$, N$)
  579.                ELSE
  580.                   LOG.LINES = LOG.LINES + 1
  581.                   IF MAX.LL > 0 THEN
  582.                      IF LOG.LINES > MAX.LL THEN
  583.                         COLOR 7, 0
  584.                         PRINT
  585.                         PRINT "              Sample MERGE created from "; MAX.LL; " lines"
  586.                         END
  587.                      END IF
  588.                   END IF
  589.                END IF
  590.             END IF
  591.          END IF
  592.       END IF
  593.    END IF
  594. REM IF (MAST# >= 9000 AND MAST# <= 9600) THEN_
  595. REM   X$="mast-out="+STR$(mast#)+" continued="+STR$(continued.mast)+" curr cont="+STR$(prev.mast)+" numeric="+STR$(natno):_
  596. REM    Y$="":CALL WRMIS (X$,Y$)
  597. RETURN
  598.  
  599. READLINETRANS:
  600.  
  601.     ONLY.LINENO = 0
  602.     IF EOF(FILENO%) THEN
  603.        IF FILENO% = 2 THEN
  604.           TRANS# = HI.VALUE#
  605.        ELSE
  606.           CLOSE 5
  607.           FILENO% = 2
  608.           GOTO READLINETRANS
  609.        END IF
  610.     ELSE
  611.        CALL GETTRANS(FILENO%, NUTRANS$, NTRANS)
  612.        CALL FIRSTWORD(NUTRANS$, FW$, BEGIN.AT)
  613.        IF FW$ = "" THEN
  614.           PREV.CONT = 0
  615.           RETURN
  616.        ELSE
  617.           IF (LEFT$(FW$, 1) = DOCCHAR$ AND IN.MERGE) THEN
  618.              GOSUB CHKMETA
  619.              GOSUB CHKPRESERVE
  620.              GOTO READLINETRANS
  621.           ELSE
  622.              CONTINUED.LINE = PREV.CONT
  623.              CALL CHKCONT(NUTRANS$, LINEON$, REMCHAR$, PREV.CONT)
  624.              IF CONTINUED.LINE = 0 THEN
  625.                 CALL NUMERIC(FW$, NATNO)
  626.                 IF NATNO OR (VAL(FW$)>0 AND RIGHT$(FW$,1)=END.LABEL$) THEN
  627.                    PREV# = TRANS#
  628.                    TRANS# = VAL(FW$)
  629.                    IF TRANS# <= PREV# THEN
  630.                       N$ = "Merge line# " + FW$ + " occurs after line#" + STR$(PREV#)
  631.                       CALL WRMIS(NUTRANS$, N$)
  632.                    ELSE
  633.                       X$ = NUTRANS$
  634.                       CALL TRIM(X$)
  635.                       IF X$ = FW$ THEN
  636.                          ONLY.LINENO = -1
  637.                       END IF
  638.                    END IF
  639.                 END IF
  640.              END IF
  641.           END IF
  642.        END IF
  643.     END IF
  644. RETURN
  645.  
  646. CHKMETA:
  647.    IF FW$ <> METALINE$ THEN RETURN
  648.    CALL UPCASE(NUTRANS$)
  649.    CALL BRKWORDS(NUTRANS$, CWRDS$(), NWORDS)
  650.    START.WORD = 2
  651. DOMETA:
  652.    VALID.META = 0
  653.    IF CWRDS$(START.WORD) = "SET" THEN
  654.       IF START.WORD + 3 > NWORDS OR CWRDS$(START.WORD + 2) <> "=" OR CWRDS$(START.WORD + 3) = "" THEN
  655.          CALL WRMIS(NUTRANS$, "SET without '=' or missing value")
  656.          RETURN
  657.       ELSE
  658.          VALID.META = -1
  659.          X$ = "SET " + CWRDS$(START.WORD + 1) + " " + CWRDS$(START.WORD + 2) + " " + CWRDS$(START.WORD + 3)
  660.          GOSUB PRINTLAST
  661.          CALL CHKNARY(CWRDS$(START.WORD + 1), METANAME$(), NMETA, FOUND, 1)
  662.          IF FOUND = 0 THEN
  663.            IF NMETA < UBOUND(METANAME$) THEN
  664.               NMETA = NMETA + 1
  665.               FOUND = NMETA
  666.               METANAME$(NMETA) = CWRDS$(START.WORD + 1)
  667.            END IF
  668.          END IF
  669.          METAVAL$(NMETA) = CWRDS$(START.WORD + 3)
  670.          RETURN
  671.       END IF
  672.    END IF
  673.    IF CWRDS$(START.WORD) = "INCLUDE" THEN
  674.       VALID.META = -1
  675.       IF START.WORD + 1 > NWORDS OR CWRDS$(START.WORD + 1) = "" THEN
  676.          CALL WRMIS(NUTRANS$, "INCLUDE with no file specified")
  677.          RETURN
  678.       ELSE
  679.          CALL EXIST(CWRDS$(START.WORD + 1) + CHR$(0), FOUND)
  680.          IF FOUND = 0 THEN
  681.             X$ = "Include file <" + CWRDS$(START.WORD + 1) + "> missing"
  682.             CALL WRMIS(NUTRANS$, X$)
  683.             RETURN
  684.          END IF
  685.          FILENO% = 5
  686.          OPEN CWRDS$(START.WORD + 1) FOR INPUT AS #5
  687.          X$ = "INCLUDE " + CWRDS$(START.WORD + 1)
  688.          GOSUB PRINTLAST
  689.          RETURN READLINETRANS
  690.       END IF
  691.    END IF
  692.    IF CWRDS$(START.WORD) = "IF" THEN
  693.       IF START.WORD + 4 > NWORDS OR CWRDS$(START.WORD + 4) <> "THEN" THEN
  694.          CALL WRMIS(NUTRANS$, "IF without THEN")
  695.          RETURN
  696.       ELSE
  697.          X$ = LEFT$(MID$(NUTRANS$,INSTR(NUTRANS$,"IF")),50)
  698.          GOSUB PRINTLAST
  699.          VALID.META = -1
  700.          CALL CHKNARY(CWRDS$(START.WORD + 1), METANAME$(), NMETA, FOUND, 1)
  701.          IF FOUND < 1 THEN
  702.             CALL WRMIS(NUTRANS$, "IF has undefined metavariable <" + CWRDS$(START.WORD + 1) + ">")
  703.             RETURN
  704.          ELSE
  705.             IF CWRDS$(START.WORD + 3) = "" THEN
  706.                CALL WRMIS("IF lacks comparison value", NUTRANS$)
  707.                RETURN
  708.             ELSE
  709.                ANTECEDENT = (METAVAL$(FOUND) = CWRDS$(START.WORD + 3))
  710.             END IF
  711.          END IF
  712.          IF CWRDS$(START.WORD + 5) = "BLOCK" THEN IN.BLOCK = -1
  713.          IF ANTECEDENT THEN
  714.             IF IN.BLOCK THEN
  715.                RETURN
  716.             ELSE
  717.                START.WORD = START.WORD + 5
  718.                GOTO DOMETA
  719.             END IF
  720.          ELSE
  721.             IF IN.BLOCK THEN
  722.                OPTIONAL.END$ = "ELSE"
  723.                GOSUB SKIPBLOCK
  724.             ELSE
  725.                CALL CHKNARY("ELSE", CWRDS$(), NWORDS, FOUND, START.WORD + 6)
  726.                IF FOUND > 0 AND START.WORD + 5 < NWORDS THEN
  727.                   START.WORD = FOUND + 1
  728.                   GOTO DOMETA
  729.                ELSE
  730.                   'CALL WRMIS(NUTRANS$, "Warning: IF without matching ELSE")
  731.                   RETURN
  732.                END IF
  733.             END IF
  734.          END IF
  735.       END IF
  736.       RETURN
  737.    END IF
  738.    IF CWRDS$(START.WORD) = "ELSE" THEN
  739.       IF NOT IN.BLOCK THEN
  740.          CALL WRMIS (NUTRANS$,"ELSE not within BLOCK")
  741.       ELSE
  742.          VALID.META = -1
  743.          X$ = "ELSE"
  744.          GOSUB PRINTLAST
  745.          IF ANTECEDENT THEN
  746.             OPTIONAL.END$ = CHR$(26)
  747.             GOSUB SKIPBLOCK
  748.          END IF
  749.       END IF
  750.       RETURN
  751.    END IF
  752.    IF CWRDS$(START.WORD) = "END" THEN
  753.       IF NOT IN.BLOCK THEN
  754.          CALL WRMIS(NUTRANS$,"END IF with no IF BLOCK")
  755.       ELSE
  756.          X$ = "END IF"
  757.          GOSUB PRINTLAST 
  758.          IN.BLOCK = 0
  759.       END IF
  760.       RETURN
  761.    END IF
  762.    CALL WRMIS(NUTRANS$, "Unknown meta command")
  763.    RETURN
  764.  
  765. PRINTLAST:
  766. 'print "metacol,mrow=";metacol,mrow:input xx$
  767.    CALL QPRINT(SPACE$(79 - METACOL), METAROW, METACOL)
  768.    CALL QPRINT(X$, METAROW, METACOL)
  769.    RETURN
  770.  
  771. SKIPBLOCK:  ' Skips lines until end of block encountered
  772.    GOTENDIF = EOF(FILENO%)
  773.    WHILE NOT GOTENDIF
  774.       CALL GETTRANS (FILENO%,NUTRANS$,NTRANS)
  775.       CALL UPCASE (NUTRANS$)
  776.       CALL BRKWORDS (NUTRANS$,CWRDS$(),I)
  777.       IF (I > 1 AND CWRDS$(1) = METALINE$ AND _
  778.          (CWRDS$(2) = "END" OR CWRDS$(2) = OPTIONAL.END$ OR CWRDS$(2) = ENDBLK$)) THEN
  779.             GOTENDIF = -1
  780.       ELSE
  781.          IF EOF(FILENO%) THEN
  782.             GOTENDIF = -1
  783.             CALL WRMIS(NUTRANS$,"BLOCK IF-THEN-ELSE with no END IF")
  784.          END IF
  785.       END IF
  786.    WEND
  787.    IF CWRDS$(2) = "END" THEN IN.BLOCK = 0
  788. RETURN
  789.            
  790. CHKPRESERVE:
  791. REM print "chkpreserve: preserve?=";preserve.comments
  792.   IF NOT PRESERVE.COMMENTS THEN RETURN
  793.   IF INSTR(NUTRANS$, "-[ first") > 0 THEN RETURN
  794. 'print "<";nutrans$;">"
  795. 'print "cont? line=";continued.line;" prev=";prev.cont:input xx$
  796.   NUTRANS$ = LEFT$(NUTRANS$, BEGIN.AT - 1) + BLED.SOURCE.COMMENT$ + RIGHT$(NUTRANS$, LEN(NUTRANS$) - BEGIN.AT)
  797.   IF PREV.CONT = -1 THEN CALL WRITENEW(NUTRANS$, NWRITE, REMOVE.COMMENTS) ELSE RETURN EXIT2LEVELS ' 06-06
  798. REM print "<";nutrans$;">"
  799.  
  800. RETURN
  801. EXIT2LEVELS:
  802.    RETURN
  803.  
  804. REM -----------------------[ DOMERGE ]-------------------------------------
  805.  
  806. DOMERGE:
  807.  
  808. REM        GENERAL BLED MERGE BASED ON BLOCK and BLOCK DISPOSITION
  809.  
  810.   TOPTITLE$ = "MERGING - General BLED"
  811.   GOSUB STANDARDFILES
  812.   IF FANS$ = "Q" THEN RETURN
  813.   
  814.   CALL GETNXTCMD(FILENO%, CMD$, DOCCHAR$, STBLKTYPE$, ENDBLKTYPE$, STDES.NO%, ENDDES.NO%, STTARGET$, ENDTARGET$, INCREMENT%, PTR%, CMD.TYPE$, INS.BLKTYPE$, FIXED.NO%, BLK.DISP$)
  815.   
  816.   WHILE CMD.TYPE$ <> ""
  817. REM     PRINT "domerge: CMD$=";CMD$;" TYPE=";CMD.TYPE$;" INS BLKTYPE=";INS.BLKTYPE$
  818.      IF CMD.TYPE$ = "I" THEN IF INS.BLKTYPE$ = "L" THEN GOSUB WRNTIMES ELSE GOSUB WRTBLOCK ELSE LINE.DISP$ = "K":                                                       PTR.INCREMENT% = 1:        TARGET$ = STTARGET$:        BLOCK.TYPE$ = STBLKTYPE$: _
  819.             DESIRED.PTR = STDES.NO%: GOSUB ADVANCE: LINE.DISP$ = BLK.DISP$:  BLOCK.TYPE$ = ENDBLKTYPE$:        DESIRED.PTR = ENDDES.NO%:        TARGET$ = ENDTARGET$:        PTR.INCREMENT% = INCREMENT%:        GOSUB ADVANCE
  820.      CALL GETNXTCMD(FILENO%, CMD$, DOCCHAR$, STBLKTYPE$, ENDBLKTYPE$, STDES.NO%, ENDDES.NO%, STTARGET$, ENDTARGET$, INCREMENT%, PTR%, CMD.TYPE$, INS.BLKTYPE$, FIXED.NO%, BLK.DISP$)
  821.  
  822.   WEND
  823.   CLOSE #1, #2
  824.   
  825. RETURN
  826.  
  827. ADVANCE:
  828.       REM DECIDES HOW TO ADVANCE THROUGH OLD FILE
  829.       REM PASS BLOCK.TYPE$
  830.  
  831.       IF BLOCK.TYPE$ = "L" THEN GOSUB READTOLINE ELSE IF BLOCK.TYPE$ = "S" THEN GOSUB READTOSTRING ELSE IF BLOCK.TYPE$ = "LABEL" OR BLOCK.TYPE$ = "LABEL#" THEN GOSUB READTOLABEL ELSE M$ = "WARNING: ILLEGAL BLOCK TYPE ": _
  832.                                                              W$ = BLOCK.TYPE$: CALL WRMIS(M$, W$)
  833. RETURN
  834.          
  835. READTOLINE:
  836.  
  837.    REM READS UPTO LINE DESIRED.PTR IN OLD
  838.  
  839.    WHILE PTR% < DESIRED.PTR AND NOT EOF(1)
  840.       GOSUB READOLD
  841.       PTR% = PTR% + PTR.INCREMENT%
  842.       IF LINE.DISP$ = "K" THEN CALL WRITENEW(TRANS$, NWRITE, REMOVE.COMMENTS) ' 06-06
  843.    WEND
  844. RETURN
  845.  
  846. READTOSTRING:
  847.  
  848.    REM READS UPTO A STRING IN OLD
  849.  
  850.    TRANS$ = TARGET$
  851.    IF NOT EOF(1) THEN GOSUB READOLD
  852.    WHILE INSTR(TRANS$, TARGET$) = 0
  853.       PTR% = PTR% + 1
  854.       IF LINE.DISP$ = "K" THEN CALL WRITENEW(TRANS$, NWRITE, REMOVE.COMMENTS) ' 06-06
  855.       IF NOT EOF(1) THEN GOSUB READOLD ELSE M$ = "WARNING: STRING " + TARGET$ + " NOT FOUND":                          W$ = "":         CALL WRMIS(M$, W$):         TRANS$ = TARGET$
  856.    WEND
  857.    PREV.OLD$ = TRANS$
  858.  
  859. RETURN
  860.  
  861. READTOLABEL:
  862.  
  863.    REM READS UPTO A LABEL IN OLD
  864.  
  865.    IF IGNORECASE THEN CALL UPCASE(TARGET$)
  866.    IF BLOCK.TYPE$ = "LABEL" AND RIGHT$(TARGET$, 1) <> END.LABEL$ THEN TARGET$ = TARGET$ + END.LABEL$
  867.    IF NOT EOF(1) THEN GOSUB READOLD:           GOSUB GETFIRSTWORD ELSE FIRST.WORD$ = TARGET$:             TRANS$ = ""
  868.    WHILE FIRST.WORD$ <> TARGET$
  869.       PTR% = PTR% + 1
  870.       IF LINE.DISP$ = "K" THEN CALL WRITENEW(TRANS$, NWRITE, REMOVE.COMMENTS) ' 06-06
  871.       IF NOT EOF(1) THEN GOSUB READOLD:                 GOSUB GETFIRSTWORD ELSE M$ = "WARNING: LABEL " + TARGET$ + " NOT FOUND":                  W$ = "":         CALL WRMIS(M$, W$):         FIRST.WORD$ = TARGET$
  872.    WEND
  873.    PREV.OLD$ = TRANS$
  874.  
  875. RETURN
  876.  
  877. GETFIRSTWORD:
  878.  
  879.    CALL FIRSTWORD(TRANS$, FIRST.WORD$, BEGIN.AT)
  880.    IF IGNORECASE THEN CALL UPCASE(FIRST.WORD$)
  881.  
  882. RETURN
  883.  
  884. READOLD:
  885.  
  886.    REM FETCHES NEXT UNPROCESSED RECORD FROM OLD
  887.  
  888.    IF PTR% <= NREAD THEN TRANS$ = PREV.OLD$ ELSE GOSUB READOLDREC
  889.  
  890. RETURN
  891.  
  892. READOLDREC:
  893.  
  894.    LINE INPUT #1, TRANS$
  895.    NREAD = NREAD + 1
  896.    LOCATE MROW, MCOL: PRINT NREAD;
  897.  
  898. RETURN
  899.  
  900. WRNTIMES:
  901.    REM WRITES EXACTLY N RECORDS FROM TRANSACTION FILE
  902.  
  903.    WHILE FIXED.NO% > 0 AND NOT EOF(FILENO%)           ' 2.0
  904.       GOSUB READTRANS
  905.       FIXED.NO% = FIXED.NO% - 1
  906.       CALL WRITENEW(NUTRANS$, NWRITE, REMOVE.COMMENTS) ' 06-06
  907.    WEND
  908. RETURN
  909.  
  910. READTRANS:
  911.  
  912.    REM FETCHES NEXT DATA (NON-COMMAND) RECORD FROM TRANSACTION FILE
  913.    REM NOTE: WILL NOT SKIP OVER ANY LINES
  914.  
  915.    CALL GETTRANS(FILENO%, NUTRANS$, NTRANS)       ' 2.0
  916.    CALL FIRSTNB(NUTRANS$, ONE, BS): IF BS < 1 THEN BS = 1
  917.    LSET TRANSBLK$ = MID$(NUTRANS$, BS, LBLK)
  918. REM   print "RT BS=";BS;" trans=";trans$;" transblk=<";transblk$;"> endblk=<";endblk$;">"
  919.  
  920. RETURN
  921.  
  922. WRTBLOCK:
  923.  
  924.    REM INSERT ROUTINE WHEN BLOCK
  925.  
  926.    IF NOT EOF(FILENO%) THEN GOSUB READTRANS         ' 2.0
  927.    WHILE TRANSBLK$ <> ENDBLK$ AND NOT EOF(FILENO%)  ' 2.0
  928.       CALL WRITENEW(NUTRANS$, NWRITE, REMOVE.COMMENTS) ' 06-06
  929.       GOSUB READTRANS
  930.    WEND
  931.  
  932. RETURN
  933.  
  934. REM --------------------[ SHARED ROUTINES ]-----------------------------
  935.  
  936. GETFILES:
  937.  
  938. REM PROMPTS FOR 3 FILE NAMES NEEDED
  939.  
  940.    GOSUB CHKEXTENSIONS
  941.    FFLDVAL$(1) = ORIGFILE$
  942.    FFLDVAL$(2) = BTCHCMDS$
  943.    FFLDVAL$(3) = NEWFILE$
  944.    CALL PRTSCRN(THREE, FROW(), FCOL(), FPROMPT$(), FFLDSIZE(), FFLDTYPE$(), FFLDVAL$(), FHLP$())
  945.    CALL CENTERBEG(TOPTITLE$, SEVENTYTWO, BEG)
  946.    CALL QPRINT(TOPTITLE$, FOUR, BEG)
  947.    IF RUN.BATCH THEN FANS$ = "R": GOTO GOTFILES
  948.  
  949.      CO = 1: CALL QPRINT(SPACE$(79), FRO, CO)
  950.      FANS$ = "E"
  951.      CALL GETCHAR(EDRO, EDCO, EDPRO$, EDVAL$, FANS$)
  952.      WHILE FANS$ = "E"
  953.        CALL GETSCRN(THREE, FROW(), FCOL(), FPROMPT$(), FFLDSIZE(), FFLDTYPE$(), FFLDVAL$(), FHLP$())
  954.        LOCATE EDRO, 1: PRINT SPACE$(79)
  955.        FANS$ = "": CALL GETCHAR(EDRO, EDCO, EDPRO$, EDVAL$, FANS$)
  956.      WEND
  957.  
  958. GOTFILES:
  959.    IF FANS$ <> "Q" THEN
  960.       GOSUB PREPARECOUNTS
  961.       ORIGFILE$ = FFLDVAL$(1)
  962.       BTCHCMDS$ = FFLDVAL$(2)
  963.       NEWFILE$ = FFLDVAL$(3)
  964.       GOSUB OPENFILES
  965.       PRINT #4, "--[USING FILES "; ORIGFILE$; " "; BTCHCMDS$; " "; NEWFILE$; "]--"
  966.    END IF
  967.  
  968. RETURN
  969.  
  970. CHKEXTENSIONS:
  971.  
  972.    IF INSTR(ORIGFILE$, ".") = 0 THEN ORIGFILE$ = ORIGFILE$ + "." + DESOURCE$
  973.    IF INSTR(BTCHCMDS$, ".") = 0 THEN IF FILE.COMPARE THEN BTCHCMDS$ = BTCHCMDS$ + "." + DESOURCE$ ELSE BTCHCMDS$ = BTCHCMDS$ + "." + DEMERGES$
  974.    IF INSTR(NEWFILE$, ".") = 0 THEN IF FILE.COMPARE THEN NEWFILE$ = NEWFILE$ + "." + DEMERGES$ ELSE NEWFILE$ = NEWFILE$ + "." + DESOURCE$
  975.  
  976. RETURN
  977.  
  978. PREPARECOUNTS:
  979.  
  980.   COLOR 0, 7
  981.   LOCATE 24, 1
  982.   PRINT SPACE$(79);
  983.   LOCATE 24, 4: PRINT "SOURCE:";
  984.   LOCATE 24, 23: PRINT "CHANGES:";
  985.   LOCATE 24, 42: PRINT "NEW:";
  986.   LOCATE 24, 60: PRINT "WARNINGS:";
  987.  
  988.   TROW = 24
  989.   TCOL = 31
  990.   WROW = 24
  991.   WCOL = 46
  992.   MROW = 24
  993.   MCOL = 11
  994.   WROW = 24
  995.   WCOL = 69
  996.  
  997. RETURN
  998.  
  999. STANDARDFILES:
  1000.  
  1001.   FHLP$(1) = "Text file to be edited (e.g. source code in TEST.BAS)"
  1002.   FHLP$(2) = "Merges (edits, changes) to be applied (e.g. TEST.MRG)"
  1003.   FHLP$(3) = "Save changes made in this file (e.g. old + merges -> TESTNEW.BAS)"
  1004.   FPROMPT$(1) = "SOURCE File:"
  1005.   FPROMPT$(2) = " MERGE File:"
  1006.   FPROMPT$(3) = "   NEW File:"
  1007.   GOSUB GETFILES
  1008.  
  1009. RETURN
  1010.  
  1011. OPENFILES:
  1012.  
  1013.   ON ERROR GOTO ERROPEN
  1014.   FF$ = ORIGFILE$
  1015.   OPEN "I", #1, FF$
  1016.   FF$ = BTCHCMDS$
  1017.   FILENO% = 2
  1018.   OPEN "I", #2, FF$
  1019.   FF$ = NEWFILE$
  1020.   OPEN "O", #3, FF$
  1021.   ON ERROR GOTO 0
  1022.  
  1023.   NREAD = 0
  1024.   NWRITE = 0
  1025.   NTRANS = 0
  1026.   PTR% = 1
  1027.  
  1028. RETURN
  1029.  
  1030. ERROPEN:
  1031.    X$ = "Error" + STR$(ERR) + " opening file " + FF$
  1032.    CALL EXPLAIN(X$)
  1033.    FLDSIZ = 30
  1034.    RO = 23: CO = 1: CALL QPRINT(SPACE$(79), RO, CO)
  1035.    CO = 13: PROMPT$ = "Enter file name (<rtn> quits): "
  1036.    FFF$ = ""
  1037.    CALL GETSTR(RO, CO, PROMPT$, FLDSIZ, FFF$)
  1038.    IF FFF$ = "" THEN RESUME QUITMERGE ELSE FF$ = FFF$: GOSUB PREPARECOUNTS: RESUME
  1039. QUITMERGE: FANS$ = "Q": RETURN
  1040.  
  1041. REM *****************   SHARED CALLED SUBROUTINES   *****************
  1042.  
  1043. SUB BRKWORDS (STRNG$, WORDS$(), NPARMS) STATIC
  1044.  
  1045. REM PASS STRNG$  - A STRING TO BE BROKEN INTO WORDS (SPACE
  1046. REM                 DELIMITED STRINGS)
  1047. REM      WORDS$  - AN ARRAY TO PUT WORDS IN
  1048.  
  1049. REM DEFINT A-Z
  1050. ONE = 1
  1051. LST = LEN(STRNG$)
  1052. X$ = STRNG$ + " !"
  1053. CALL FIRSTNB(X$, ONE, BS)
  1054. NPARMS = 0
  1055. MAXPARMS = UBOUND(WORDS$)
  1056. WHILE BS <= LST
  1057.   NPARMS = NPARMS + 1
  1058.   CALL LASTNB(X$, BS, ES)
  1059.   IF NPARMS > MAXPARMS THEN BS = LST + 1 ELSE WORDS$(NPARMS) = MID$(X$, BS, ES - BS + 1):       BS = ES + 1:   CALL FIRSTNB(X$, BS, BS)
  1060. WEND
  1061. END SUB
  1062.  
  1063. SUB CENTERBEG (STRNG$, LSIZE%, BEG%) STATIC
  1064.  
  1065. REM COMPUTERS CENTERED POSITION OF STRNG$ IN FIELD OF SIZE LSIZE%
  1066. REM PASS STRNG$   - STRING TO BE CENTERED
  1067. REM      LSIZE%   - LENGTH OF FIELD TO CENTER
  1068. REM GET  BEG%     - STARTING POSITION OF STRNG$ IN LSIZE%.  RETURNS
  1069. REM                 1 IF STRNG$ TOO BIG TO FIT
  1070.  
  1071.    REM DEFINT A-Z
  1072.    X = LEN(STRNG$)
  1073.    IF X > LSIZE% THEN BEG% = 1 ELSE BEG% = (LSIZE% - X) / 2
  1074.  
  1075. END SUB
  1076.  
  1077. SUB CHKCONT (STRNG$, LINEON$, REMCHAR$, CONTINUED%) STATIC
  1078.  
  1079. REM CHECKS WHETHER LINE STRNG$ CONTINUES LOGICALLY TO NEXT LINE
  1080.  
  1081. DEFINT A-Z
  1082. REM IF DEB=0 THEN DEB = INSTR(STRNG$,"9150 IF")
  1083. REM IF DEB>0 THEN IF INSTR(STRNG$,"9510 US") THEN DEB = 0
  1084. CONTINUED% = 0
  1085. ONE = 1
  1086. BS = 1
  1087. LS = LEN(STRNG$)
  1088. LCO = INSTR(STRNG$, LINEON$)
  1089. IF LCO = 0 THEN GOTO GETOUTCHKCONT
  1090. CHKREM:
  1091.     X = INSTR(BS, STRNG$, REMCHAR$)
  1092.     IF X = 0 THEN X$ = STRNG$: GOTO ALLSTRNG ELSE CALL FIRSTNB(STRNG$, ONE, XX):                IF X = XX THEN GOTO GETOUTCHKCONT
  1093.     CALL INQUOTES(STRNG$, X, INQUO)
  1094.     IF INQUO > 0 THEN BS = INQUO + 1: IF BS <= LS THEN GOTO CHKREM
  1095.     X$ = LEFT$(STRNG$, X - 1)
  1096. ALLSTRNG:
  1097.     CALL ENDNB(X$, ES)
  1098.     CONTINUED% = (MID$(X$, ES, 1) = LINEON$)
  1099. REM    IF CONTINUED% <> 0 THEN PRINT "es=";es;" checking char <";MID$(X$,ES,1);">  CONT?=";CONTINUED%
  1100. GETOUTCHKCONT:
  1101. REM IF DEB>0 THEN_
  1102. REM   PRINT "CONT?=";CONTINUED%;" for >";STRNG$;"<":_
  1103. REM   PRINT "LCO=";LCO;" REM POS =";X;" INQUO=";INQUO;" BS= ";BS;" ES=";ES;:INPUT XX$:PRINT
  1104. END SUB
  1105.  
  1106. SUB CHKNARY (ELEMENT$, ARRAY$(), NUM.ENTRIES.TO.SEARCH%, IS.IN.ARA%, BEG%) STATIC
  1107.       IS.IN.ARA% = BEG%
  1108.       CALL UPCASE(ELEMENT$)
  1109.       MAX.TRIES% = NUM.ENTRIES.TO.SEARCH% + 1
  1110.       ARRAY$(MAX.TRIES%) = ELEMENT$
  1111.       WHILE ARRAY$(IS.IN.ARA%) <> ELEMENT$
  1112.          IS.IN.ARA% = IS.IN.ARA% + 1
  1113.       WEND
  1114.       IF IS.IN.ARA% = MAX.TRIES% THEN IS.IN.ARA% = 0
  1115. END SUB
  1116.  
  1117. SUB CHKWRDS (BLKTYPE$, DES.NO%, TARGET$, NUWRD%, INCMT%, WRDS$(), BEG%, PTR%) STATIC
  1118.  
  1119. REM DEFINT A-Z
  1120. REM PASS WRDS$      - ARRAY OF WORDS
  1121. REM      BEG%        - FIRST ELEMENT OF ARRAY TO EXAMINE
  1122. REM      PTR%        - CURRENT LINE # OF SOURCE FILE
  1123. REM GET  BLKTYPE$  - HOW BLOCK DEFINED (LINE,STRING,LABEL)
  1124. REM      DES.NO%     - DESIRED LINE NUMBER FOR LINE BLOCK TYPE
  1125. REM      TARGET$    - TARGET STRING FOR STRING/LABEL BLOCK TYPE
  1126. REM      INCMT%      - FLAG SET TO 0 WHEN BLOCK EXTENDS TO END-OF-FILE,
  1127. REM                     OTHERWISE 1
  1128. REM      NUWRD%      - LAST WORD POSITION THIS ROUTINE EXAMINED
  1129. REM PRINT "SUB CHKWRDS RECEIVED BEG=";BEG%;" PTR=";PTR%
  1130. TARGET$ = ""
  1131. INCMT% = 1
  1132. DES.NO% = 0
  1133. IF BEG% < 1 THEN BEG% = 1: PRINT "UPPED BEG%"
  1134. REM IF PTR%<10 THEN PTR%=10:PRINT "UPPED PTR%"
  1135. WD$ = WRDS$(BEG%)
  1136. FLET$ = LEFT$(WD$, 1)
  1137. IF FLET$ <> "L" AND FLET$ <> "S" THEN BLKTYPE$ = "L":     NUWRD% = BEG% ELSE NUWRD% = BEG% + 1:  IF WD$ = "LABEL" OR WD$ = "LABEL#" THEN BLKTYPE$ = "LABEL":       TARGET$ = WRDS$(NUWRD%) ELSE IF FLET$ = "S" THEN BLKTYPE$ = "S":           TARGET$ =  _
  1138. WRDS$(NUWRD%) ELSE BLKTYPE$ = "L"
  1139. WD$ = WRDS$(NUWRD%)
  1140. L2$ = LEFT$(WD$, 2)
  1141. RES$ = MID$(WD$, 3)
  1142. IF BLKTYPE$ = "L" THEN IF L2$ = "*+" THEN CALL NUMERIC(RES$, POSNUM):            IF POSNUM THEN DES.NO% = VAL(RES$) + PTR% ELSE M$ = "NON-NUMERIC IN LINE NUMBER FIELD":                          CALL WRMIS(M$, WD$) ELSE IF L2$ = "*" THEN DES.NO% =  _
  1143. PTR% ELSE CALL NUMERIC(WD$, POSNUM):               IF POSNUM THEN DES.NO% = VAL(WD$) ELSE IF WD$ = "END" THEN INCMT% = 0 ELSE M$ = "NON-NUMERIC IN LINE NUMBER FIELD":                                                                        CALL WRMIS( _
  1144. M$, WD$)
  1145. IF BLKTYPE$ <> "L" AND TARGET$ = "" THEN M$ = "STRING/LABEL MISSING":       CALL WRMIS(M$, WD$)
  1146. REM PRINT "CHKWRDS RETURNED DESNO=";DES.NO%;" NUWRD=";NUWRD%
  1147. END SUB
  1148.  
  1149. SUB CREDITS STATIC
  1150.  
  1151. REM PUTS UP CREDITS WHEN PROGRAM INVOKED
  1152.  
  1153. REM DEFINT A-Z
  1154. SEC = 3
  1155. CLS
  1156. KEY OFF
  1157.  
  1158. RO = 1: CO = 12: X$ = "BLED - A SOURCE CODE MERGE UTILITY  ver 2.2  May 16, 1989"'03-20-88
  1159. CALL QPRINT(X$, RO, CO)
  1160. RO = 3: CO = 3: X$ = "Copyright (c) 1985-88  Ken Goosens, 5020 Portsmouth Rd, Fairfax, VA 22032"
  1161. CALL QPRINT(X$, RO, CO)
  1162. RO = 6: CO = 2: X$ = "You are granted a limited license to use and distribute this program provided"
  1163. CALL QPRINT(X$, RO, CO)
  1164. RO = 8: CO = 10: X$ = "1.  you do not alter or remove this notice"
  1165. CALL QPRINT(X$, RO, CO)
  1166. RO = 10: CO = 10: X$ = "2.  you receive no fee or charge for this program"
  1167. CALL QPRINT(X$, RO, CO)
  1168. RO = 12: CO = 10: X$ = "3.  modifications are distributed only as a merge to this program"
  1169. CALL QPRINT(X$, RO, CO)
  1170. RO = 14: CO = 10: X$ = "4.  you assume all liability for using this program"
  1171. CALL QPRINT(X$, RO, CO)
  1172. LOCATE 16, 1: CALL PRTHELP
  1173. CALL WAITSECORKEY(SEC)
  1174.  
  1175. END SUB
  1176.  
  1177. SUB ECHO (STRNG$, ROW%, COL%, FLDSIZE%) STATIC
  1178.  
  1179. REM ROUTINE FOR CLEARING A SPACE AND PRINTING MESSAGE
  1180.  
  1181. CALL QPRINT(SPACE$(FLDSIZE%), ROW%, COL%)
  1182. CALL QPRINT(STRNG$, ROW%, COL%)
  1183.  
  1184. END SUB
  1185.  
  1186. SUB ENDNB (STRNG$, LST%) STATIC
  1187.  
  1188. REM LOCATES LAST NON-BLANK CHARACTER IN STRNG$.  0 IF NONE.
  1189.  
  1190. REM PASS STRNG$ - STRING TO BE SEARCHED
  1191. REM GET  LST%   - POSITION IN STRNG$ OF LAST NON-BLANK
  1192.  
  1193.    X$ = "!" + STRNG$
  1194.    LST% = LEN(X$)
  1195.    WHILE MID$(X$, LST%, 1) = " "
  1196.      LST% = LST% - 1
  1197.    WEND
  1198.    LST% = LST% - 1
  1199.  
  1200. END SUB
  1201.  
  1202. SUB EXPERR (STRNG$) STATIC
  1203.  
  1204. REM EXPLAIN AN ERROR
  1205.  
  1206. REM DEFINT A-Z
  1207. BEEP
  1208.  
  1209. CALL EXPLAIN(STRNG$)
  1210. SEC = 2
  1211. CALL WAITSECORKEY(SEC)
  1212. BEEP
  1213.  
  1214. END SUB
  1215.  
  1216. SUB EXPLAIN (STRNG$) STATIC
  1217.  
  1218. REM CONTROLS MESSAGE IN INVERSE VIDEO ON LINE 24
  1219.  
  1220. REM DEFINT A-Z
  1221. RO = 24
  1222. CO = 3
  1223. PGE = 0
  1224. ATTR = (7 AND 7) * 16
  1225. X$ = LEFT$(STRNG$, 75)
  1226. CALL XQPRINT(" " + X$ + SPACE$(75 - LEN(X$)), RO, CO, ATTR, PGE)
  1227. COLOR 7, 0
  1228.  
  1229. END SUB
  1230.  
  1231. SUB FIRSTNB (STRNG$, BEG%, WHEREIS%) STATIC
  1232.  
  1233. REM PASS STRNG$  - A STRING TO BE SEARCHED
  1234. REM      BEG%     - POSITION TO BEGIN SEARCH
  1235. REM GET  WHEREIS% - POSITION IN STRNG$ OF FIRST NON-BLANK AT
  1236. REM                  BEG% OR LATER.  RETURNS 0 IF NO NON-BLANK.
  1237.  
  1238. REM DEFINT A-Z
  1239. REM LOCATE 24,70:PRINT "FIRSTNB  ";
  1240. X$ = STRNG$ + "!"
  1241. WHEREIS% = BEG%
  1242. IF WHEREIS% < 1 THEN WHEREIS% = 1
  1243. WHILE MID$(X$, WHEREIS%, 1) = " "
  1244.    WHEREIS% = WHEREIS% + 1
  1245. WEND
  1246. IF WHEREIS% > LEN(STRNG$) THEN WHEREIS% = 0
  1247.  
  1248. END SUB
  1249.  
  1250. SUB FIRSTWORD (STRNG$, FIRST.WORD$, BS) STATIC
  1251.  
  1252. REM RETURNS FIRST WORD IN STRNG$
  1253. REM PASS STRNG$   - STRING TO BE SEARCHED
  1254. REM GET  FIRST.WORD$ - FIRST WORD IN STRNG$
  1255.  
  1256. REM DEFINT A-Z
  1257.  
  1258. ONE = 1
  1259. CALL FIRSTNB(STRNG$, ONE, BS)
  1260. IF BS > 0 THEN CALL LASTNB(STRNG$, BS, ES):    FIRST.WORD$ = MID$(STRNG$, BS, ES - BS + 1) ELSE FIRST.WORD$ = ""
  1261.  
  1262. END SUB
  1263.  
  1264. SUB GETCHAR (ROW%, COL%, PROMPT$, VLDANS$, RESULT$) STATIC
  1265.  
  1266. REM ROUTINE TO GET SINGLE CHARACTER
  1267. REM LOCATE 24,70:PRINT "GETCHAR ";
  1268. REM DEFINT A-Z
  1269. CR$ = CHR$(13)
  1270. FLDSIZE% = 1
  1271. CALL QPRINT(PROMPT$ + RESULT$, ROW%, COL%)
  1272. X% = COL% + LEN(PROMPT$)
  1273. LOCATE ROW%, X%, 1, 6, 7
  1274. X$ = INPUT$(1)
  1275. IF X$ = CR$ THEN X$ = RESULT$: IF X$ = "" THEN X$ = CHR$(0)
  1276. CALL UPCASE(X$)
  1277. IF VLDANS$ <> "" THEN WHILE INSTR(VLDANS$, X$) = 0:      BEEP:      X$ = INPUT$(1): CALL UPCASE(X$):    WEND
  1278. RESULT$ = X$: PRINT RESULT$;
  1279.  
  1280. END SUB
  1281.  
  1282. SUB GETDISP (BUF$(), NUM.NBUF%, DOCCHAR$, BLK.DISP$, FILENO%) STATIC
  1283.  
  1284. REM PASS BUF$      - ARRAY CONTAINING BUFFERED BLED COMMANDS
  1285. REM      NUM.NBUF%  - NUMBER OF UNUSED ELEMENTS IN BUF$
  1286. REM      DOCCHAR$   - FIRST CHAR OF REMARK LINE IN MERGE FILE (1ST WORD)
  1287. REM GET  BLK.DISP$  - DISPOSITION OF BLOCK
  1288.  
  1289. REM DEFINT A-Z
  1290. REM PRINT "GETDISP ENTERED NUM.NBUF=";NUM.NBUF%
  1291. ONE = 1
  1292.   CALL READNXT(FILENO%, BUF$(), NUM.NBUF%, DOCCHAR$, CMD$)
  1293.   CALL FIRSTNB(CMD$, ONE, BS)
  1294.   IF BS > 0 THEN BLK.DISP$ = MID$(CMD$, BS, 1) ELSE BLK.DISP$ = "K"
  1295.   IF INSTR("DRK", BLK.DISP$) = 0 THEN BLK.DISP$ = "K":      NUM.NBUF% = NUM.NBUF% + 1:   BUF$(NUM.NBUF%) = CMD$ ELSE IF BLK.DISP$ = "R" THEN BLK.DISP$ = "D":                    NUM.NBUF% = NUM.NBUF% + 1:      CALL LASTNB(CMD$, BS, ES):       IF ES < _
  1296.  LEN(CMD$) THEN BUF$(NUM.NBUF%) = "I " + MID$(CMD$, ES + 1) ELSE N$ = "REPLACE command must be followed by 'BLOCK' or # of lines":               CALL WRMIS(CMD$, N$)
  1297.            
  1298. END SUB
  1299.  
  1300. SUB GETNATNUM (ROW%, COL%, PROMPT$, FLDSIZE%, RESULT$) STATIC
  1301.  
  1302. REM ROUTINE TO INPUT ONLY NATURAL NUMBER (> OR = 0)
  1303. REM LOCATE 24,70:PRINT "GETNATNUM ";
  1304.  
  1305. REM DEFINT A-Z
  1306. RESTART:
  1307.   CALL GETSTR(ROW%, COL%, PROMPT$, FLDSIZE%, RESULT$)
  1308.   CALL NUMERIC(RESULT$, NONNEG%)
  1309. IF NOT NONNEG% THEN BEEP: GOTO RESTART
  1310.  
  1311. END SUB
  1312.  
  1313. SUB GETNXTCMD (FILENO%, CMD$, DOCCHAR$, STBLKTYPE$, ENDBLKTYPE$, STDES.NO%, ENDDES.NO%, STTARGET$, ENDTARGET$, INCREMENT%, PTR%, CMD.TYPE$, INS.BLKTYPE$, FIXED.NO%, BLK.DISP$) STATIC
  1314.  
  1315. REM FETCHES NEXT COMMAND, PARSES, AND SETS ALL PARMS FOR PROCESSING
  1316.  
  1317. REM DEFINT A-Z
  1318. DIM BUF$(10)
  1319. REM PRINT "GETNXTCMD ENTERED"
  1320. CALL READNXT(FILENO%, BUF$(), NUM.NBUF%, DOCCHAR$, CMD$)    ' 2.0
  1321.  
  1322. IF CMD$ = "" THEN CMD.TYPE$ = "" ELSE CALL PARSECMD(CMD$, STBLKTYPE$, ENDBLKTYPE$, STDES.NO%, ENDDES.NO%, STTARGET$, ENDTARGET$, INCREMENT%, PTR%, INCLUSIVE%, CMD.TYPE$, INS.BLKTYPE$, FIXED.NO%):                         IF CMD.TYPE$ = "B" THEN CALL  _
  1323. GETDISP(BUF$(), NUM.NBUF%, DOCCHAR$, BLK.DISP$, FILENO%): IF INCLUSIVE% THEN NUM.NBUF% = NUM.NBUF% + 1:     BUF$(NUM.NBUF%) = BLK.DISP$:        NUM.NBUF% = NUM.NBUF% + 1:      BUF$(NUM.NBUF%) = "BLOCK FROM LINE * TO *+1"
  1324.  
  1325. REM PRINT "GETNXTCMD: CMD=";CMD$;" CMD TYPE=";CMD.TYPE$;" BLOCK DISP=";BLK.DISP$
  1326. END SUB
  1327.  
  1328. SUB GETSCRN (NUMFLDS%, ROW%(), COL%(), PROMPT$(), FLDSIZE%(), FLDTYPE$(), FLDVAL$(), HLP$()) STATIC
  1329.  
  1330. REM DOES FULL SCREEN DATA ENTRY FOR TABLE DRIVEN SCREEN
  1331.  
  1332. REM DEFINT A-Z
  1333. NUL$ = ""
  1334. TOPGETSCRN:
  1335.   FOR I = 1 TO NUMFLDS%
  1336.     CALL EXPLAIN(HLP$(I))
  1337.     X = INSTR("LSN", FLDTYPE$(I))
  1338.     IF X > 1 THEN IF X = 2 THEN CALL GETSTR(ROW%(I), COL%(I), PROMPT$(I), FLDSIZE%(I), FLDVAL$(I)) ELSE CALL GETNATNUM(ROW%(I), COL%(I), PROMPT$(I), FLDSIZE%(I), FLDVAL$(I))
  1339.   NEXT I
  1340.  
  1341. END SUB
  1342.  
  1343. SUB GETSTR (ROW%, COL%, PROMPT$, FLDSIZE%, RESULT$) STATIC
  1344.  
  1345. REM INPUT ROUTINE TO GET A STRING
  1346. REM LOCATE 24,70:PRINT "GETSTR  ";
  1347.  
  1348. X% = FLDSIZE% + 1: IF X% < 8 THEN X% = 8
  1349. CALL QPRINT(PROMPT$ + SPACE$(X%), ROW%, COL%)
  1350. X% = COL% + LEN(PROMPT$) + 1
  1351. CALL ECHO(RESULT$, ROW%, X%, FLDSIZE%)
  1352. LOCATE ROW%, X%
  1353. INPUT "", X$
  1354. IF X$ <> "" THEN RESULT$ = X$: CALL ECHO(RESULT$, ROW%, X%, FLDSIZE%)
  1355.  
  1356. END SUB
  1357.  
  1358. SUB GETTRANS (FILENO%, TRANS$, NTRANS%) STATIC     ' 2.0
  1359.  
  1360. REM FETCHES TRANSACTION RECORD
  1361. REM PASS NTRANS% - VALUE OF 0 TO INITIALIZE COUNTER, OTHERWISE > 0
  1362. REM GET  TRANS%  - NEW TRANSACTION RECORD
  1363.  
  1364.    REM DEFINT A-Z
  1365.  
  1366.    LINE INPUT #FILENO%, TRANS$                      ' 2.0
  1367.    IF NTRANS% < 1 THEN LOCTRANS = 0: NTRANS% = 1
  1368.    LOCTRANS = LOCTRANS% + 1
  1369.    LOCATE 24, 31: PRINT LOCTRANS%;
  1370.  
  1371. END SUB
  1372.  
  1373. SUB INQUOTES (STRNG$, BS%, INQUO%) STATIC
  1374.  
  1375. REM CHECKS WHETHER CHARACTER AT POSITION BS% IN STRNG$
  1376. REM        IS INSIDE A PAIR OF QUOTES.  RETURNS POSITION OF RIGHT QUOTE
  1377. REM        IF INSIDE, 0 IF NOT INSIDE
  1378.  
  1379. REM DEFINT A-Z
  1380. QUOTE$ = CHR$(34)
  1381. BEG = 1
  1382. INQUO% = 0
  1383. CHKQAGAIN:
  1384.   FQUO = INSTR(BEG, STRNG$, QUOTE$)
  1385.   IF FQUO = 0 THEN GOTO GETOUTINQUOTES
  1386.   IF BS% <= FQUO THEN GOTO GETOUTINQUOTES
  1387.   SQUO = INSTR(FQUO + 1, STRNG$, QUOTE$)
  1388.   IF SQUO = 0 THEN GOTO GETOUTINQUOTES
  1389.   IF BS% < SQUO THEN INQUO% = SQUO: GOTO GETOUTINQUOTES
  1390.   BEG = SQUO + 1
  1391. GOTO CHKQAGAIN
  1392.   
  1393. GETOUTINQUOTES:
  1394. REM PRINT "INQUOTES: LOOKING AT POS ";BS%;"<";MID$(STRNG$,BS%,1);"> SENDING INQUO=";INQUO%
  1395. END SUB
  1396.  
  1397. SUB KEEPONLY (L$, GOODSTRNG$) STATIC
  1398.  
  1399. REM KEEPS IN L$ ONLY THOSE CHARACTERS IN GOODSTRNG$, I.E.
  1400. REM     REMOVES FROM L$ ALL INSTANCES OF CHARACTERS NOT IN GOODSTRNG$
  1401.  
  1402. REM PASS L$         - STRING TO BE ALTERED
  1403. REM      GOODSTRNG$ - LIST OF CHARACTERS TO KEEP
  1404. REM GET  L$         - ORIGINAL MINUS CHARS NOT IN GOODSTRNG$
  1405.  
  1406. REM DEFINT A-Z
  1407. J = 0
  1408. FOR I = 1 TO LEN(L$)
  1409.   IF INSTR(GOODSTRNG$, MID$(L$, I, 1)) THEN J = J + 1:    MID$(L$, J, 1) = MID$(L$, I, 1)
  1410. NEXT I
  1411. L$ = LEFT$(L$, J)
  1412.  
  1413. END SUB
  1414.  
  1415. SUB LASTNB (STRNG$, BEG%, WHEREIS%) STATIC
  1416.  
  1417. REM PASS STRNG$   - A STRING TO BE SEARCHED
  1418. REM      BEG%      - POSITION TO BEGIN SEARCH
  1419. REM GET  WHEREIS%  - LAST POSITION IN STRNG$ OF ANY WORD BEGINNING AT
  1420. REM                   BEG% OR LATER.  RETURNS BEG%-1 IF NO WORD AT BEG%.
  1421.  
  1422. REM DEFINT A-Z
  1423. REM LOCATE 24,70:PRINT "LASTNB  ";
  1424. B = BEG%
  1425. IF B < 1 THEN B = 1
  1426. IF B > LEN(STRNG$) THEN X$ = " " ELSE X$ = MID$(STRNG$, B) + " "
  1427. WHEREIS% = INSTR(X$, " ") - 1 + B - 1
  1428.  
  1429. END SUB
  1430.  
  1431. SUB NOOTHER (STRNG$, ONLY$, RESULT%) STATIC
  1432.  
  1433. REM PASS STRNG$  - A STRING TO BE SEARCHED
  1434. REM      ONLY$   - A LIST OF THE ONLY CHARACTERS TO BE IN STRNG$
  1435. REM GET  RESULT%  - TRUE OF ONLY CHARACTERS IN STRNG$ ARE THOSE IN ONLY$
  1436. REM                   OR ARE LEADING OR TRAILING BLANKS
  1437.  
  1438. REM DEFINT A-Z
  1439.  
  1440. RESULT% = -1
  1441. IF LEN(STRNG$) < 1 THEN GOTO GETOUTNOOTHER
  1442. ONE = 1
  1443. CALL FIRSTNB(STRNG$, ONE, BS)
  1444. CALL LASTNB(STRNG$, BS, ES)
  1445.  
  1446. FOR I = BS TO ES
  1447.    IF INSTR(ONLY$, MID$(STRNG$, I, 1)) = 0 THEN
  1448.       RESULT% = 0
  1449.       I = ES + 1
  1450.    END IF
  1451. NEXT I
  1452.  
  1453. IF STRNG$ <> MID$(STRNG$, 1, ES) + SPACE$(LEN(STRNG$) - ES) THEN RESULT% = 0
  1454.  
  1455. GETOUTNOOTHER:
  1456. END SUB
  1457.  
  1458. SUB NUMERIC (STRNG$, RESULT%) STATIC
  1459.  
  1460. REM PASS STRNG$  - A STRING TO BE SEARCHED
  1461. REM GET  RESULT%  - TRUE IF STRNG$ CONTAINS ONLY NON-NEGATIVE DIGITS
  1462. REM                  OR LEADING OR TRAILING BLANKS
  1463.  
  1464. REM DEFINT A-Z
  1465. IF STRNG$ = SPACE$(LEN(STRNG$)) THEN RESULT% = 0: GOTO GETOUTNUMERIC
  1466. NUM$ = "0123456789"
  1467. CALL NOOTHER(STRNG$, NUM$, RESULT%)
  1468. GETOUTNUMERIC:
  1469. END SUB
  1470.  
  1471. SUB PARSECMD (CMD$, STBLKTYPE$, ENDBLKTYPE$, STDES.NO%, ENDDES.NO%, STTARGET$, ENDTARGET$, INCREMENT%, PTR%, INCLUSIVE%, CMD.TYPE$, INS.BLKTYPE$, FIXED.NO%) STATIC
  1472.  
  1473. REM DEFINT A-Z
  1474. DIM WRDS$(10)
  1475. REM BREAKS COMMAND LINE INTO WORDS AND CHECKS FOR PROPER SYNTAX
  1476.  
  1477. REM PASS CMD$     - BLED COMMAND LINE
  1478. REM      PTR%     - CURRENT LINE POSITION IN ORIGINAL SOURCE FILE
  1479. REM GET  STBLKTYPE$  - BLOCK TYPE DEFINING START BLOCK
  1480. REM     ENDBLKTYPE#  - BLOCK TYPE DEFINING END BLOCK
  1481. REM      STDES.NO%   - LINE NUMBER OF SOURCE THAT BEGINS BLOCK
  1482. REM     ENDDES.NO%   - LINE NUMBER OF SOURCE THAT ENDS BLOCK
  1483. REM      STTARGET$   - STRING/LABEL DEFINING START OF BLOCK
  1484. REM     ENDTARGET$   - STRING/LABEL DEFINING END OF BLOCK
  1485. REM     INCREMENT%   - COUNTER FOR ADVANCING READS (0 IF TO END,
  1486. REM                       NORMALLY AND OTHERWISE 1)
  1487. REM     CMD.TYPE$    - TYPE OF COMMAND (Insert, Block)
  1488. REM     INS.BLKTYPE$ - TYPE OF INSERT BLOCK (Blocked, or Lines)
  1489. REM     FIXED.NO%    - Fixed number of lines to insert
  1490.  
  1491. CALL BRKWORDS(CMD$, WRDS$(), IX)
  1492.  
  1493. CMD.TYPE$ = LEFT$(WRDS$(1), 1)
  1494. IF INSTR("IB", CMD.TYPE$) = 0 THEN
  1495.    EXP$ = "BLED COMMAND MUST BEGIN WITH 'I' OR 'B'"
  1496.    CALL WRMIS(EXP$, CMD$)
  1497.    GOTO GETOUT
  1498. END IF
  1499. IF CMD.TYPE$ = "I" AND WRDS$(2) = "" THEN WRDS$(2) = "B"
  1500. IF CMD.TYPE$ = "I" THEN
  1501.    IF LEFT$(WRDS$(2), 1) <> "B" THEN
  1502.       INS.BLKTYPE$ = "L"
  1503.       CALL NUMERIC(WRDS$(2), POSNUM)
  1504.       IF POSNUM THEN
  1505.          FIXED.NO% = VAL(WRDS$(2))
  1506.          GOTO GETOUT
  1507.       ELSE
  1508.          EXP$ = "INSERT command should specify # of lines to include"
  1509.          CALL WRMIS(EXP$, CMD$)
  1510.          GOTO GETOUT
  1511.       END IF
  1512.    ELSE
  1513.       INS.BLKTYPE$ = "B"
  1514.       GOTO GETOUT
  1515.    END IF
  1516. END IF
  1517. IF LEFT$(WRDS$(2), 1) = "F" THEN NXT.WRD = 3 ELSE NXT.WRD = 2
  1518. CALL CHKWRDS(STBLKTYPE$, STDES.NO%, STTARGET$, NXT.WRD, INCREMENT%, WRDS$(), NXT.WRD, PTR%)
  1519. NXT.WRD = NXT.WRD + 1
  1520. FL$ = LEFT$(WRDS$(NXT.WRD), 1)
  1521. IF INSTR("UT", FL$) = 0 THEN
  1522.    INCLUSIVE% = 0
  1523. ELSE
  1524.    NXT.WRD = NXT.WRD + 1
  1525.    IF FL$ = "U" OR WRDS$(NXT.WRD - 1) = "TO" THEN
  1526.       INCLUSIVE% = 0
  1527.    ELSE
  1528.       INCLUSIVE% = -1
  1529.    END IF
  1530. END IF
  1531. CALL CHKWRDS(ENDBLKTYPE$, ENDDES.NO%, ENDTARGET$, NXT.WRD, INCREMENT%, WRDS$(), NXT.WRD, PTR%)
  1532. GETOUT:
  1533. REM PRINT "PARSECMD: INCLUSIVE=";INCLUSIVE%
  1534. END SUB
  1535.  
  1536. SUB PRTHELP STATIC
  1537.  
  1538. REM PRINTS HELP (DOCUMENTATION) SCREEN
  1539.  
  1540. PRINT
  1541. PRINT "Apply a  merge:  BLED[/B/L/M/RC]  {source} {merges} {new file} {warn file}" ' 06-06
  1542. PRINT "Create a merge:  BLED[/F/B/RC]  {old version} {new vers} {merges} {warn file}" ' 06-06
  1543. PRINT "Options: B=run batch  F=file compare  L=line# merge  M=merge RC=remove comments" ' 06-06
  1544. PRINT
  1545.  
  1546. END SUB
  1547.  
  1548. SUB PRTSCRN (NUMFLDS%, ROW%(), COL%(), PROMPT$(), FLDSIZE%(), FLDTYPE$(), FLDVAL$(), HLP$()) STATIC
  1549.  
  1550. REM PRINTS TABLE DRIVEN SCREEN
  1551.  
  1552. REM DEFINT A-Z
  1553. CLS
  1554. FOR I = 1 TO NUMFLDS%
  1555.   CALL QPRINT(PROMPT$(I), ROW%(I), COL%(I))
  1556.   X% = COL%(I) + LEN(PROMPT$(I)) + 1
  1557.   CALL ECHO(FLDVAL$(I), ROW%(I), X%, FLDSIZE%(I))
  1558. NEXT I
  1559.  
  1560. END SUB
  1561.  
  1562. SUB READNXT (FILENO%, BUF$(), NUM.NBUF%, DOCCHAR$, CMD$) STATIC' 2.0
  1563.  
  1564. REM PROCESSES REQUEST FOR NEXT BLED COMMAND
  1565. REM PASS BUF$     - BUFFER ARRAY
  1566. REM      NUM.NBUF% - NUMBER ACTIVE ENTRIES IN BUFFER
  1567. REM      DOCCHAR$  - FIRST CHAR OF DOCUMENTATION LINE
  1568. REM GET  CMD$     - BLED COMMAND LINE
  1569.  
  1570. REM DEFINT A-Z
  1571. ONE = 1
  1572. CMD$ = ""
  1573. FW$ = ""
  1574. IF NUM.NBUF% > 0 THEN
  1575.    CMD$ = BUF$(NUM.NBUF%)
  1576.    NUM.NBUF% = NUM.NBUF% - 1
  1577.    GOTO GETOUTREADNXT
  1578. END IF
  1579. WHILE (CMD$ = SPACE$(LEN(CMD$)) OR LEFT$(FW$, 1) = DOCCHAR$) AND NOT EOF(FILENO%)' 2.0
  1580.    CALL GETTRANS(FILENO%, CMD$, ONE)              ' 2.0
  1581.    CALL FIRSTWORD(CMD$, FW$, BEGIN.AT)
  1582. WEND
  1583. IF EOF(FILENO%) AND LEFT$(FW$, 1) = DOCCHAR$ THEN CMD$ = ""
  1584. IF CMD$ = SPACE$(LEN(CMD$)) THEN
  1585.    IF EOF(1) THEN
  1586.       CMD$ = ""
  1587.    ELSE
  1588.       CMD$ = "BLOCK FROM LINE * THRU END"
  1589.       NUM.NBUF% = NUM.NBUF% + 1
  1590.       BUF$(NUM.NBUF%) = "KEEP"
  1591.    END IF
  1592. END IF
  1593. GETOUTREADNXT:
  1594. REM PRINT "FROM READNXT: CMD IS {";CMD$;"}  DOCCHAR=";DOCCHAR$
  1595. END SUB
  1596.  
  1597. SUB REALNUM (STRNG$, RESULT%) STATIC
  1598.  
  1599. REM CHECKS WHETHER STRNG$ IS A VALID REAL NUMBER
  1600. REM PASS STRNG$  - STRING TO BE CHECKED
  1601. REM GET  RESULT% - TRUE IF REAL
  1602.  
  1603. REM DEFINT A-Z
  1604. X$ = STRNG$ + "."
  1605. LENGTH = LEN(STRNG$)
  1606. J = 1
  1607. WHILE INSTR("+- ", MID$(X$, J, 1))
  1608.   J = J + 1
  1609. WEND
  1610. IF J > LENGTH THEN RESULT% = 0: EXIT SUB
  1611.  
  1612. X = INSTR(X$, ".")
  1613. FRONT$ = MID$(STRNG$, J, X - J)
  1614. IF X > LENGTH THEN BACK$ = "" ELSE BACK$ = MID$(STRNG$, X + 1)
  1615.  
  1616. CALL NUMERIC(FRONT$, FRNNAT%)
  1617. CALL NUMERIC(BACK$, BNNAT%)
  1618. RESULT% = (FRNNAT% AND BNNAT%)
  1619.  
  1620. END SUB
  1621.  
  1622. SUB REMOVE (L$, BADSTRNG$) STATIC
  1623.  
  1624. REM REMOVES FROM L$ ALL INSTANCES OF CHARACTERS IN BADSTRNG$
  1625.  
  1626. REM PASS L$        - STRING TO BE ALTERED
  1627. REM      BADSTRNG$ - LIST OF CHARACTERS TO REMOVE
  1628. REM GET  L$        - ORIGINAL MINUS BADSTRNG$
  1629.  
  1630. REM DEFINT A-Z
  1631. J = 0
  1632. FOR I = 1 TO LEN(L$)
  1633.   IF INSTR(BADSTRNG$, MID$(L$, I, 1)) = 0 THEN J = J + 1:    MID$(L$, J, 1) = MID$(L$, I, 1)
  1634. NEXT I
  1635. L$ = LEFT$(L$, J)
  1636.  
  1637. END SUB
  1638.  
  1639. SUB TRANSLATE (L$, GOT$, WANT$) STATIC
  1640.  
  1641. REM REPLACES IN L$ ALL INSTANCES OF CHARACTER IN GOT$ BY CORRESPONDING
  1642. REM   CHARACTER IN WANT$
  1643.  
  1644. REM PASS L$     - STRING TO BE ALTERED
  1645. REM      GOT$   - LIST OF CHARACTERS WANTED REPLACED
  1646. REM      WANT$  - WHAT REPLACE BY
  1647. REM GET  L$     - ALTERED STRING
  1648.  
  1649. REM DEFINT A-Z
  1650. FOR I = 1 TO LEN(L$)
  1651.   PO = INSTR(GOT$, MID$(L$, I, 1))
  1652.   IF PO THEN MID$(L$, I, 1) = MID$(WANT$, PO, 1)
  1653. NEXT I
  1654.  
  1655. END SUB
  1656.  
  1657. SUB TRIM (STRNG$) STATIC
  1658.  
  1659. REM REMOVES LEADING AND TRAILING BLANKS FROM STRNG$
  1660.  
  1661. REM DEFINT A-Z
  1662. ONE = 1
  1663. CALL FIRSTNB(STRNG$, ONE, STRT)
  1664. IF STRT < 1 THEN STRT = 1: LST = 0 ELSE CALL ENDNB(STRNG$, LST)
  1665. STRNG$ = MID$(STRNG$, STRT, LST - STRT + 1)
  1666.  
  1667. END SUB
  1668.  
  1669. SUB TRIMTRAIL (STRNG$)
  1670.  
  1671. CALL ENDNB (STRNG$, LST)
  1672. STRNG$ = LEFT$(STRNG$,LST)
  1673.  
  1674. END SUB
  1675.  
  1676. SUB WAITSECORKEY (SECONDS%) STATIC
  1677.  
  1678. REM PAUSE ROUTINE BASED ON CLOCK
  1679. REM SEND SECONDS% - MAXIMUM # SECONDS TO WAIT
  1680. REM WILL QUIT IF ANY KEY PRESSED
  1681.  
  1682. CURSEC! = (VAL(MID$(TIME$, 4, 2)) * 60 + VAL(MID$(TIME$, 7, 2)))
  1683. DONE! = CURSEC! + SECONDS%
  1684. WHILE CURSEC! < DONE! AND INKEY$ = ""
  1685.    CURSEC! = (VAL(MID$(TIME$, 4, 2)) * 60 + VAL(MID$(TIME$, 7, 2)))
  1686. WEND
  1687.  
  1688. END SUB
  1689.  
  1690. SUB WRITENEW (NEWOUT$, NWRITE%, SKIP.COMMENTS) STATIC
  1691.  
  1692. REM WRITES NEWOUT$ TO NEW FILE
  1693.  
  1694. REM DEFINT A-Z
  1695.    DIM OBUF$(100)
  1696.    IF NWRITE% < 0 THEN
  1697.       FOR I = 1 TO NUM.IN.BUF
  1698.          PRINT #3, OBUF$(I)
  1699.       NEXT
  1700.       NUM.IN.BUF = 0
  1701.       EXIT SUB
  1702.    END IF
  1703.    IF NUM.IN.BUF = 100 THEN
  1704.       FOR I = 1 TO 100
  1705.          PRINT #3, OBUF$(I)
  1706.       NEXT
  1707.       NUM.IN.BUF = 0
  1708.    END IF
  1709.    SKIP.LINE = FALSE                                        ' 06-06
  1710.    IF SKIP.COMMENTS THEN                                    ' 06-06
  1711.       QB.META = INSTR(NEWOUT$,"$INC") > 0                         ' 06-06
  1712.       IF NOT QB.META THEN                                         ' 06-06
  1713.          CALL FIRSTWORD (NEWOUT$,FW$,BEGIN.AT)                    ' 06-06
  1714.          SKIP.LINE = (FW$ = "REM" OR LEFT$(FW$,1) = "'")          ' 06-06
  1715.          IF NOT SKIP.LINE THEN                                    ' 06-06
  1716.             X = INSTR(NEWOUT$,"'")                                ' 06-06
  1717.             IF X > 0 THEN                                         ' 06-06
  1718.                CALL INQUOTES (NEWOUT$,X,INQUO)                    ' 06-06
  1719.                IF INQUO = 0 THEN                                  ' 06-06
  1720.                   NEWOUT$ = LEFT$(NEWOUT$,X-1)                    ' 06-06
  1721.                   CALL TRIMTRAIL (NEWOUT$)                        ' 06-06
  1722.                   IF RIGHT$(NEWOUT$,LEN(FW$)) = FW$ THEN          ' 06-06
  1723.                      NEWOUT$ = NEWOUT$ + " '"                     ' 06-06
  1724.                   END IF                                          ' 06-06
  1725.                END IF                                             ' 06-06
  1726.             END IF                                          ' 06-06
  1727.          END IF                                             ' 06-06
  1728.       END IF                                                ' 06-06
  1729.    END IF                                                   ' 06-06
  1730.    IF NOT SKIP.LINE THEN                                    ' 06-06
  1731.       NUM.IN.BUF = NUM.IN.BUF + 1                           ' 06-06
  1732.       OBUF$(NUM.IN.BUF) = NEWOUT$                           ' 06-06
  1733.    END IF                                                   ' 06-06
  1734.    NWRITE% = NWRITE% + 1
  1735.    LOCATE 24, 46: PRINT NWRITE;
  1736.  
  1737. END SUB
  1738.  
  1739. SUB WRMIS (EXPLN$, MISTAKE$) STATIC
  1740.  
  1741. REM PASS EXPLN$    - ERROR MESSAGE
  1742. REM      MISTAKE#  - THE MISTAKE CAUSING THE ERROR
  1743. REM      WARNFILE$ - FILE TO WRITE MESSAGES TO
  1744. REM GET            - LOG MISTAKE & EXPLANATION TO FILE F$
  1745.  
  1746. REM DEFINT A-Z
  1747.  
  1748. PRINT #4, MISTAKE$
  1749. PRINT #4, EXPLN$
  1750. NWARN = NWARN + 1
  1751. LOCATE 24, 69: PRINT NWARN;
  1752.  
  1753. END SUB
  1754.